package com.diaohaiwen.framework.mq.rocket.properties;

import lombok.Data;
import org.apache.rocketmq.client.AccessChannel;
import org.apache.rocketmq.common.utils.NetworkUtil;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

/**
 * @author 刁海文
 * @since 2024/1/16 21:07
 */
@Data
@Configuration
@ConfigurationProperties("config.rocket")
public class ClientProperties {

    private boolean enable;
    /**
     * NameServer的地址列表,多个以 [;] 拼接,从-D系统参数rocketmq.namesrv.addr或环境变量。NAMESRV_ADDR
     */
    private String serverAddr;
    /**
     * 实例名称,从-D系统参数rocketmq.client.name获取，否则就是DEFAULT
     */
    private String instanceName = "D-Hw";
    /**
     * 客户端ID
     */
    private String clientIp = NetworkUtil.getLocalAddress();

    /**
     * 客户端命名空间
     */
    private String namespace;
    /**
     * 设置访问通道
     */
    private AccessChannel channel = AccessChannel.LOCAL;

    /**
     * 明明空间初始化
     */
    private boolean namespaceInitialized = false;
    /**
     * 客户端通信层接收到网络请求的时候，处理器的核数
     */
    private int clientCallbackExecutorThreads = Runtime.getRuntime().availableProcessors();
    /**
     * 轮询从NameServer获取路由信息的时间间隔 30000，单位毫秒
     */
    private int pollNameServerInterval = 30000;
    /**
     * 定期发送注册心跳到broker的间隔 30000，单位毫秒
     */
    private int heartbeatBrokerInterval = 30000;
    /**
     * 作用于Consumer，持久化消费进度的间隔 默认值5000，单位毫秒
     */
    private int persistConsumerOffsetInterval = 5000;
    /**
     * 拉取消息出现异常的延迟时间设置 1000，单位毫秒
     */
    private long pullTimeDelayMillsWhenException = 1000;
    /**
     * 单位名称
     */
    private String unitName;
    /**
     * 单位模式
     */
    private boolean unitMode;
    /**
     * 是否启用vip netty通道以发送消息,从-D com.rocketmq.sendMessageWithVIPChannel参数的值，若无则是true
     */
    private boolean vipChannelEnabled = true;

    /**
     * 是否使用安全传输。
     */
    private boolean useTLS;

    /**
     * mq客户端api超时设置,3000，单位毫秒
     */
    private int mqClientApiTimeout = 3000;

    /**
     * 生产者配置
     */
    private ProducerProperties producer = new ProducerProperties();
    /**
     * 消费者配置
     */
    private ConsumerProperties consumer = new ConsumerProperties();
}
